//$URL: http://deveth0.googlecode.com/svn/trunk/demos/jersey-springsecurity/src/main/java/de/deveth0/demos/jerseyspringsecurity/security/CustomResourceFilterFactory.java $
//$Id: CustomResourceFilterFactory.java 2 2012-10-23 18:30:23Z amuthmann@gmail.com $
/*
 * Copyright 2012 deveth0.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package de.deveth0.demos.jerseyspringsecurity.security;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.ext.Provider;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory;
import com.sun.jersey.api.model.AbstractMethod;
import com.sun.jersey.spi.container.ResourceFilter;
import de.deveth0.demos.jerseyspringsecurity.security.annotations.RequireUserIdCheck;
import de.deveth0.demos.jerseyspringsecurity.security.annotations.RequireUserValidated;
import de.deveth0.demos.jerseyspringsecurity.security.contextfilter.UserIdCheckContextFilter;
import de.deveth0.demos.jerseyspringsecurity.security.contextfilter.UserValidatedContextFilter;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;

/**
 * A custom resourcefilterfactory used to add additional filters to the request-chain
 *
 * @author deveth0
 */
@Component
@Provider
public class CustomResourceFilterFactory extends RolesAllowedResourceFilterFactory {

  @Context
  private UriInfo mUriInfo;
  @Autowired
  private UserValidatedContextFilter mUserValidatedContextFilter;

  @Override
  public List<ResourceFilter> create(AbstractMethod pAbstractMethod) {
    List<ResourceFilter> rolesFilters = super.create(pAbstractMethod);
    if (null == rolesFilters) {
      rolesFilters = new ArrayList<ResourceFilter>();
    }
    List<ResourceFilter> filters = new ArrayList<ResourceFilter>(rolesFilters);

    // Add the userId check
    if (pAbstractMethod.isAnnotationPresent(RequireUserIdCheck.class)
            || pAbstractMethod.getResource().isAnnotationPresent(RequireUserIdCheck.class)) {
      filters.add(0, new UserIdCheckContextFilter(mUriInfo));
    }
    // Add the user validated check 
    if (pAbstractMethod.isAnnotationPresent(RequireUserValidated.class)
            || pAbstractMethod.getResource().isAnnotationPresent(RequireUserValidated.class)) {
      filters.add(mUserValidatedContextFilter);
    }
    return filters;
  }
}